/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package grasp;

import model.Continente;
import model.Pais;
import model.Vuelo;
import model.Almacen;
import model.Pedido;
import model.Ruta;
import model.Fecha;
import java.io.* ;
import java.util.* ;
/**
 *
 * @author WPQ
 */
public class Utils {    
    public static int numContinentes = 5 ;
    public static String[] cont = { "America" , "Asia" , "Africa" , "Europa" , "Oceania" } ;
    public static int maxPaises = 200 ;
    public static int maxPedidos = 20 ;
    public static int maxVuelos = 300 ;
    public static int maxCapacidad = 300 ;
    public static int maxDuracionInter = 12 ;
    public static int maxDuracionConti = 6 ;
    public static int anhoIni = 2012 ;
    public static int maximoX = 300 ;
    public static int maximoY = 700 ;
    public static int maximoPrecio = 1000 ;
    public static int[] days = { 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 } ;
    public static int numInput = -1 ;

    public static int bisiesto( int anho ){
        boolean R = ( ( anho % 4 == 0 ) && ( ( anho % 100 != 0 ) || ( anho % 400 == 0 ) ) ) ;
        return ( R ? 1 : 0 ) ;
    }

    public static int getDias( int mes , int anho ){
        if( mes != 2 ) return days[ mes - 1 ] ;
        return days[ mes - 1 ] + bisiesto( anho ) ;
    }

    public static void generarDataAleatoria( int data ) throws IOException{
        FileWriter fw = new FileWriter( "INPUT/input" + (data+1) + ".in" ) ;
        PrintWriter pw = new PrintWriter( fw ) ;

        
        /* ======== CONTINENTE ======== */
        pw.println( numContinentes ) ; // <--------- Continentes
        for(int i = 0 ; i < numContinentes ; i++){
            pw.println( cont[ i ] ) ;
        }

        
        /* ======== PAIS - ALMACEN ======== */
        Random R = new Random() ;
//        int numPaises = R.nextInt( maxPaises ) ; // <---------------------------------- CAMBIAR LUEGO
        int numPaises = 60 ;
        pw.println( numPaises ) ; // <---- numPaises
        ArrayList<Almacen> alm = new ArrayList<Almacen>() ;
        for(int i = 0 ; i < numPaises ; i++){
            int X = R.nextInt( maximoX ) ;
            int Y = R.nextInt( maximoY ) ;
            int continente = R.nextInt( numContinentes ) ;
            int cap = R.nextInt( maxCapacidad ) ;
            String nombPais = ( "P" + i ) ;
            String nombCiudad = ( "C" + i ) ;
            pw.println( X + " " + Y + " " + continente + " " + cap + " " + nombPais + " " + nombCiudad ) ; // <---- Pais "i"
            alm.add( new Almacen( i, new Pais( i , X , Y , nombPais, nombCiudad, new Continente( continente , "" ) ) , cap ) ) ;
        }

        /* ======== PEDIDO ======== */
//        int numPedidos = R.nextInt( maxPedidos ) ; // <-------------------------------------------- CAMBIAR LUEGO
        int numPedidos = 1 ;
        pw.println( numPedidos ) ; // <---- numPedidos
        for(int i = 0 ; i < numPedidos ; i++){
            int ini = R.nextInt( numPaises ) ;
            int fin = R.nextInt( numPaises ) ;
            int state = R.nextInt( 4 ) ; // <---------------- no entendi que era esto u.u
            int precio = R.nextInt( maximoPrecio ) ;
            int anho = R.nextInt( 1 ) + anhoIni ;
            int mes = R.nextInt( 1 ) + 10 ;
            int dia = R.nextInt(4) + 1 ;
            int hora = R.nextInt( 24 ) + 1 ;
            pw.println( ini + " " + fin + " " + state + " " + precio + " " + anho + " " + mes + " " + dia + " " + hora ) ; // <----- Pedido "i"
        }
        
        
        /* ======== VUELOS ======== */
//        int numVuelos = Math.max( 2 * numPaises , R.nextInt( maxVuelos ) ) ; // <------------------------------ CAMBIAR LUEGO
        int numVuelos = numPaises * ( numPaises - 1 ) ;
        pw.println( numVuelos ) ; // <---- numVuelos
        for(int i = 0; i < numPaises ; i++) { // Vuelos GG
            for( int j = 0 ; j < numPaises ; j++){
                if( i == j ) continue ;
                int ini = i ;
                int fin = j ;
                int cap = R.nextInt( maxCapacidad ) + 1 ;
                int costo = R.nextInt(100) ;
                String diasVuelo = generarDiasDeVuelo() ;
                int anho = R.nextInt( 1 ) + anhoIni ;
                int mes = R.nextInt( 1 ) + 10 ;
                int dia = R.nextInt(4) + 1 ;
                int hora = R.nextInt( 24 ) + 1 ;
                
                int tipo = alm.get( ini ).distinctContinent( alm.get( fin ) ) ;
                int dur = ( tipo == 1 ? R.nextInt( maxDuracionInter ) : R.nextInt( maxDuracionConti ) ) + 1  ;
            
                pw.println( ini + " " + fin + " " + cap + " " + dur + " " + dia + " " + mes + " " + anho + " " + hora + " " + costo + " " + diasVuelo ) ;
            }
        }
        pw.close();
    }
    
     public static void readData( int data ) throws FileNotFoundException, IOException{

        Scanner sc = new Scanner( new File( "INPUT/input" + (data+1) + ".in" ) ) ;
        int n;

        //Algoritmo.arContinente = new ArrayList<Continente>() ; // <------------------ Continentes
        n = sc.nextInt() ;
        for(int i = 0 ; i < n ; i++){
            String nombContinente = sc.next() ;
            Algoritmo.arContinente.add( new Continente( i , nombContinente ) ) ;
        }

        //Algoritmo.arPais = new ArrayList<Pais>() ; // <------------------ Pais
        //Algoritmo.arAlmacen = new ArrayList<Almacen>() ; // <------------------ Almacen
        n = sc.nextInt() ;
        for(int i = 0 ; i < n ; i++){
            int x = sc.nextInt() ;
            int y = sc.nextInt() ;
            int continente = sc.nextInt() ;
            int cap = sc.nextInt() ;
            String nombrePais = sc.next();
            String nombreCiudad = sc.next();
            Pais P = new Pais( i, x , y , nombrePais , nombreCiudad , Algoritmo.arContinente.get( continente ) ) ;
            Algoritmo.arPais.add( P ) ;
            Algoritmo.arAlmacen.add( new Almacen( i , P , cap ) ) ;
        }

        //Algoritmo.arPedido = new ArrayList<Pedido>() ; // <------------------ Pedido
        n = sc.nextInt() ;
        for(int i = 0 ; i < n ; i++){
            int ini = sc.nextInt() ; // origen
            int fin = sc.nextInt() ; // destino
            int estado = sc.nextInt() ;
            int precio = sc.nextInt() ;
            int anho = sc.nextInt();
            int mes = sc.nextInt();
            int dia = sc.nextInt();
            int hora = sc.nextInt();
            Fecha fCreacion = new Fecha( dia , mes , anho , hora ) ;
            Algoritmo.arPedido.add( new Pedido( i, estado, precio , Algoritmo.arAlmacen.get( ini ) , Algoritmo.arAlmacen.get( fin ), fCreacion  ) ) ;
        }

        //Algoritmo.arVuelo = new ArrayList<Vuelo>() ;// <------------------ Vuelos
        int m = sc.nextInt() ;
        for(int i = 0 ; i < m ; i++){
            int ini = sc.nextInt() ;
            int fin = sc.nextInt() ;
            int cap = sc.nextInt() ;
            int dur = sc.nextInt() ;
            
            int dia = sc.nextInt() ;
            int mes = sc.nextInt() ;
            int anho = sc.nextInt() ;
            int hora = sc.nextInt() ;
            
            int costo = (int)Integer.parseInt( sc.next() ) ;
            int tipo = Algoritmo.arAlmacen.get( ini ).distinctContinent( Algoritmo.arAlmacen.get( fin ) ) ;
            
            String diasDeVuelo = sc.next() ;
            
            Fecha fSalida = new Fecha( dia , mes , anho , hora ) ;
            Fecha fLlegada = fSalida.anhadirHoras( dur ) ;
            
            Almacen origen = Algoritmo.arAlmacen.get( ini ) ;
            Almacen destino = Algoritmo.arAlmacen.get( fin ) ;
            Vuelo V = new Vuelo( i , origen , destino , cap , dur , costo ,  tipo , diasDeVuelo , fSalida , fLlegada ) ;
            Algoritmo.arVuelo.add( V ) ;
        }
    }
     
    public static void writeData(){
        for(int i=0; i<Algoritmo.arContinente.size(); i++)
            Algoritmo.arContinente.get(i).write();
        
        for(int i=0; i<Algoritmo.arPais.size(); i++)
            Algoritmo.arPais.get(i).write();
        
        for(int i=0; i<Algoritmo.arAlmacen.size(); i++)
            Algoritmo.arAlmacen.get(i).write();
        
        for(int i=0; i<Algoritmo.arPedido.size(); i++)
            Algoritmo.arPedido.get(i).write();
        
        for(int i=0; i<Algoritmo.arVuelo.size(); i++)
            Algoritmo.arVuelo.get(i).write();
    } 
    
    public static void imprimirResultado(Ruta rutaPaquete, Pedido paquete ) throws IOException{
        toOutput( rutaPaquete ) ;
//        System.out.println("El pedido " + paquete.idPedido + " paso por la ruta " + rutaPaquete.idRuta);
//        for(int i=0; i<rutaPaquete.vuelos.size(); i++)
//            rutaPaquete.vuelos.get(i).write();
//        System.out.println("Se registro en la fecha " + paquete.fechaCreacion.aString() + ", salió en la fecha " + rutaPaquete.fechaSalida.aString() + " y llegó en la fecha " + rutaPaquete.fechaLlegada.aString());
    }
    
    public static void toOutput( Ruta r ) throws IOException{
        FileWriter fw = new FileWriter( "OUTPUT/output" + (numInput+1) + ".in" ) ;
        PrintWriter pw = new PrintWriter( fw ) ;
        
        int costTotal = 0 ;
        int distTotal = 0 ;
        int tiempoTotal = 0 ;
        for(int i = 0 ; i < r.vuelos.size() ; i++){
            Vuelo V = r.vuelos.get( i ) ;
            costTotal += V.costo ;
            tiempoTotal += V.duracion ;
            distTotal += V.getDist() ;
        }
        pw.println( "Costo = " + costTotal ) ;
        pw.println( "Distancia = " + distTotal ) ;
        pw.println( "Tiempo = " + tiempoTotal ) ;
        pw.close() ;
    }
    
    public static String generarDiasDeVuelo(){
        String D = new String() ;
        Random r = new Random() ;
        for(int i = 0 ; i < 7 ; i++) {
            D = ( D + r.nextInt( 2 ) ) ;
        }
        return D ;
    }
    
    public static int generarRand( int maximo , int val ){
        Random r = new Random() ;
        int resp = val ;
        while( ( resp = r.nextInt( maximo ) ) == val ) ;
        return resp ;
    }
    
    public static void start() throws IOException{
        Utils.generarDataAleatoria( numInput ) ;
        Utils.readData( numInput ) ;
    }
}